from flask import session,render_template,current_app, jsonify
# 从news/__init__文件中导入蓝图对象
from info.utils.response_code import RET
from . import news_blue
# 导入User模型类
from info.models import User,Category,News
# 导入常量文件
from info import constants

@news_blue.route('/')
def index():
    # 状态保持
    # session['itcast'] = '2018'
    """
    项目首页数据加载
        一、检查用户的登录状态：
        1、如果用户登录了，显示用户名信息，否则提供登录注册入口。
        2、使用session对象，从redis中获取user_id。
        3、根据user_id，查询mysql，获取用户信息
        4、传给模板
        二、新闻分类数据加载
        1、查询mysql获取新闻分类数据
        1.查询mysql，获取新闻点击排行
        按点击量展示6条新闻数据

    :return:
    """
    # 使用请求上下文对象，获取user_id
    user_id = session.get('user_id')
    user = None
    # 查询mysql，获取用户信息
    try:
        # User.query.filter_by(id = user_id).first()
        # User.query.filter(User.id==user_id).first()
        user = User.query.get(user_id)
    except Exception as e:
        current_app.logger.error(e)

        # 新闻分类数据加载
    try:
        categories = Category.query.all()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='查询新闻分类数据失败')
    # 判断查询结果
    if not categories:
        return jsonify(errno=RET.NODATA,errmsg='无新闻分类数据')
    # 定义列表，用来存储遍历后的新闻分类数据
    category_list = []
    # 遍历查询结果，调用模型类中to_dict函数，获取数据
    for category in categories:
        category_list.append(category.to_dict())

    # 查询新闻点击排行
    # news_list = ''
    try:
        news_list = News.query.order_by(News.clicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='查询新闻点击排行数据失败')
    # 判断查询结果
    if not news_list:
        return jsonify(errno=RET.NODATA,errmsg='无新闻点击排行数据')
    # 定义列表，存储查询结果
    news_click_list = []
    for news in news_list:
        news_click_list.append(news.to_dict())

    # 定义字典，用来存储返回给模板的数据
    data = {
        'user_info':user.to_dict() if user else None,
        'category_list':category_list,
        'news_click_list':news_click_list
    }

    return render_template('news/index.html',data=data)
# 加载项目logo图标，favicon.ico,浏览器会默认请求项目跟路径下的favicon文件
@news_blue.route('/favicon.ico')
def favicon():
    # 发送文件给浏览器，send_static_file是Flask框架自带的函数，作用就是发送文件给浏览器
    # Flask框架静态路由的实现就是通过这个函数实现的
    return current_app.send_static_file('news/favicon.ico')
